查看原文
其他

总说手机没有“好壁纸”,Python一次性抓取500张“美女”图片,够不够用!

旧时晚风拂晓城 杰哥的IT之旅 2022-06-07
点击上方“杰哥的IT之旅”,选择“星标”公众号
重磅干货,第一时间送达

作者 | 旧时晚风拂晓城 

编辑 | JackTian
来源 | 杰哥的IT之旅(ID:Jake_Internet)
转载请联系授权(微信ID:Hc220066)

原文链接:https://blog.csdn.net/fyfugoyfa/article/details/107734468

1. 爬取一页的图片

正则匹配提取图片数据

网页源代码部分截图如下:

重新设置 GBK 编码解决了乱码问题

代码实现:

import requests
import re

# 设置保存路径
path = r'D:\test\picture_1\ '
# 目标url
url = "http://pic.netbian.com/4kmeinv/index.html"
# 伪装请求头  防止被反爬
headers = {
    "User-Agent""Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
    "Referer""http://pic.netbian.com/4kmeinv/index.html"
}

# 发送请求  获取响应
response = requests.get(url, headers=headers)
# 打印网页源代码来看  乱码   重新设置编码解决编码问题
# 内容正常显示  便于之后提取数据
response.encoding = 'GBK'

# 正则匹配提取想要的数据  得到图片链接和名称
img_info = re.findall('img src="(.*?)" alt="(.*?)" /', response.text)

for src, name in img_info:
    img_url = 'http://pic.netbian.com' + src   # 加上 'http://pic.netbian.com'才是真正的图片url
    img_content = requests.get(img_url, headers=headers).content
    img_name = name + '.jpg'
    with open(path + img_name, 'wb'as f:     # 图片保存到本地
        print(f"正在为您下载图片:{img_name}")
        f.write(img_content)

Xpath定位提取图片数据

代码实现:

import requests
from lxml import etree

# 设置保存路径
path = r'D:\test\picture_1\ '
# 目标url
url = "http://pic.netbian.com/4kmeinv/index.html"
# 伪装请求头  防止被反爬
headers = {
    "User-Agent""Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
    "Referer""http://pic.netbian.com/4kmeinv/index.html"
}

# 发送请求  获取响应
response = requests.get(url, headers=headers)
# 打印网页源代码来看  乱码   重新设置编码解决编码问题
# 内容正常显示  便于之后提取数据
response.encoding = 'GBK'
html = etree.HTML(response.text)
# xpath定位提取想要的数据  得到图片链接和名称
img_src = html.xpath('//ul[@class="clearfix"]/li/a/img/@src')
# 列表推导式   得到真正的图片url
img_src = ['http://pic.netbian.com' + x for x in img_src]
img_alt = html.xpath('//ul[@class="clearfix"]/li/a/img/@alt')

for src, name in zip(img_src, img_alt):
    img_content = requests.get(src, headers=headers).content
    img_name = name + '.jpg'
    with open(path + img_name, 'wb'as f:   # 图片保存到本地
        print(f"正在为您下载图片:{img_name}")
        f.write(img_content)


2.翻页爬取,实现批量下载


单线程版

import requests
from lxml import etree
import datetime
import time

# 设置保存路径
path = r'D:\test\picture_1\ '
headers = {
    "User-Agent""Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
    "Referer""http://pic.netbian.com/4kmeinv/index.html"
}
start = datetime.datetime.now()

def get_img(urls):
    for url in urls:
        # 发送请求  获取响应
        response = requests.get(url, headers=headers)
        # 打印网页源代码来看  乱码   重新设置编码解决编码问题
        # 内容正常显示  便于之后提取数据
        response.encoding = 'GBK'
        html = etree.HTML(response.text)
        # xpath定位提取想要的数据  得到图片链接和名称
        img_src = html.xpath('//ul[@class="clearfix"]/li/a/img/@src')
        # 列表推导式   得到真正的图片url
        img_src = ['http://pic.netbian.com' + x for x in img_src]
        img_alt = html.xpath('//ul[@class="clearfix"]/li/a/img/@alt')
        for src, name in zip(img_src, img_alt):
            img_content = requests.get(src, headers=headers).content
            img_name = name + '.jpg'
            with open(path + img_name, 'wb'as f:  # 图片保存到本地
                # print(f"正在为您下载图片:{img_name}")
                f.write(img_content)
        time.sleep(1)

def main():
    # 要请求的url列表
    url_list = ['http://pic.netbian.com/4kmeinv/index.html'] + [f'http://pic.netbian.com/4kmeinv/index_{i}.html' for i in range(211)]
    get_img(url_list)
    delta = (datetime.datetime.now() - start).total_seconds()
    print(f"抓取10页图片用时:{delta}s")

if __name__ == '__main__':
    main()

程序运行成功,抓取了10页的图片,共210张,用时63.682837s。

多线程版

import requests
from lxml import etree
import datetime
import time
import random
from concurrent.futures import ThreadPoolExecutor

# 设置保存路径
path = r'D:\test\picture_1\ '
user_agent = [
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
    "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
    ]
start = datetime.datetime.now()

def get_img(url):
    headers = {
        "User-Agent": random.choice(user_agent),
        "Referer""http://pic.netbian.com/4kmeinv/index.html"
    }
    # 发送请求  获取响应
    response = requests.get(url, headers=headers)
    # 打印网页源代码来看  乱码   重新设置编码解决编码问题
    # 内容正常显示  便于之后提取数据
    response.encoding = 'GBK'
    html = etree.HTML(response.text)
    # xpath定位提取想要的数据  得到图片链接和名称
    img_src = html.xpath('//ul[@class="clearfix"]/li/a/img/@src')
    # 列表推导式   得到真正的图片url
    img_src = ['http://pic.netbian.com' + x for x in img_src]
    img_alt = html.xpath('//ul[@class="clearfix"]/li/a/img/@alt')
    for src, name in zip(img_src, img_alt):
        img_content = requests.get(src, headers=headers).content
        img_name = name + '.jpg'
        with open(path + img_name, 'wb'as f:  # 图片保存到本地
            # print(f"正在为您下载图片:{img_name}")
            f.write(img_content)
    time.sleep(random.randint(12))

def main():
    # 要请求的url列表
    url_list = ['http://pic.netbian.com/4kmeinv/index.html'] + [f'http://pic.netbian.com/4kmeinv/index_{i}.html' for i in range(251)]
    with ThreadPoolExecutor(max_workers=6as executor:
        executor.map(get_img, url_list)
    delta = (datetime.datetime.now() - start).total_seconds()
    print(f"爬取50页图片用时:{delta}s")

if __name__ == '__main__':
    main()

程序运行成功,抓取了50页图片,共1047张,用时56.71979s。开多线程大大提高的爬取数据的效率。

最终成果如下:


3. 其他说明

如果你觉得本文写得好,可扫描下发二维码,关注作者的 CSDN 博客,更多精彩优质文章抢先看。

福利时间

书籍赞助方:机械工业出版社
赠书书籍:《Python深度学习:逻辑 算法与编程实战》
赠书数量: 3 本

参与方式一:(1本)

通过本文进行留言,说说你在学习Python/爬虫/数据分析/编程等领域的一些问题或分享一下你的学习方法等;(话题不限、字数不限、挑选出一名最走心的留言朋友获得中奖资格)

参与方式二:(1本)

通过本公众号后台回复:抽奖,然后长按识别小程序码,即可参与抽奖。

开奖时间:9月16日,中午12:00,自动开奖,中奖者请在24小时内,必须添加我微信领取,逾期不候!

参与方式三:(1本)

将本文转发至朋友圈或微信群,截图发送至本公众号后台,选取发送的第 8 位幸运朋友。

注意:参与以上3种方式,获得中奖的机会也就更大哦!

本活动最终解释权归本公众号所有
回复下方 「关键词」,获取优质资源

回复关键词 「CDN」,即可获取 89 页 CDN 排坑指南手册
回复关键词 「ECS」,即可获取 96 页 ECS 运维 Linux 系统诊断手册
回复关键词 「linux」,即可获取 185 页 Linux 工具快速教程手册
回复关键词 「Python进阶」,即可获取 106 页 Python 进阶文档 PDF
回复关键词 「Python自动化」,即可获取 97 页自动化文档 PDF
回复关键词 「Excel数据透视表」,即可获取 136 页 Excel数据透视表 PDF
回复关键词 「Python最强基础学习文档」,即可获取 68 页 Python 最强基础学习文档 PDF
回复关键词 「wx」,即可加入杰哥的IT之旅读者交流群

end


本公众号全部博文已整理成一个目录,请在公众号后台回复「m」获取!

推荐阅读:

1、我的一位好朋友整理的第三份 PDF 文件《Python最强基础学习文档》发布了!
2、我花了一周的时间,就为了整理这份 97 页的 Python 自动化系列文档。【附获取方式】
3、我精心整理的 136 页 Excel 数据透视表 PDF 文件!【附获取方式】
4、利用 Python 爬取了 37483 条上海二手房信息,我得出的结论是?
5、利用 Python 爬取了 13966 条运维招聘信息,我得出了哪些结论?
6、不懂送女朋友什么牌子的口红?没关系!Python 数据分析告诉你。
7、“罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
8、数据分析之AB testing实战(附Python代码)
9、Python 自动化办公之"你还在手动操作“文件”或“文件夹”吗?"
10、利用 Python 进行多 Sheet 表合并、多工作簿合并、一表按列拆分

点个[在看],是对杰哥最大的支持!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存